package cn.javabb.core.service.sys;

import cn.hutool.core.collection.CollUtil;
import cn.javabb.core.annotation.RedisCache;
import cn.javabb.core.base.BaseService;
import cn.javabb.core.constant.BizConstant;
import cn.javabb.core.entity.sys.ConfigDO;
import cn.javabb.core.mapper.sys.SysConfigMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author QINB imqinbao@163.com
 * @CreateDate 2018/11/22/022 15:48
 * @Since V1.0
 */
@Service
@Slf4j
public class SysConfigService extends BaseService<ConfigDO> {

    @Resource
    private SysConfigMapper sysConfigMapper;

    @RedisCache
    public String getConfigValue(String configCode){
        ConfigDO config = new ConfigDO();
        config.setConfigCode(configCode);
        return this.queryOne(config)==null?null:this.queryOne(config).getConfigValue();
    }

    public String getConfigValue(String configCode, String defaultValue) {
        String value = this.getConfigValue(configCode);
        return StringUtils.isBlank(value) ? defaultValue : value;
    }
    public ConfigDO getByConfigCode(String code){
        ConfigDO config = new ConfigDO();
        config.setConfigCode(code);
        config = this.queryOne(config);
        return config;

    }

    /**
     * 获取配置参数
     * @param configType
     * @return
     */
    @RedisCache
    public Map<String,String> getConfigs(String configType){
        ConfigDO configDO = new ConfigDO();
        if(StringUtils.isNotBlank(configType)){
            configDO.setConfigType(configType);
        }
        List<ConfigDO> list = this.queryListByWhere(configDO);
        if (CollUtil.isEmpty(list)) {
            return null;
        }
        Map<String, String> res = new HashMap<>();
        list.forEach(config->{
            res.put(String.valueOf(config.getConfigCode()),config.getConfigValue());
        });

        return res;
    }


    @RedisCache(flush = true)
    public boolean saveOrUpdate(ConfigDO configDO){
        String result = this.insertOrUpdate(configDO);
        return ("insert".equals(result) || "update".equals(result))?true:false;
    }
    @RedisCache(flush = true)
    public boolean batchUpdate(Map<String,String> configMap){
        String configType = configMap.get("configType");
        for (Map.Entry<String,String> entry:configMap.entrySet()){
            ConfigDO c = getByConfigCode(entry.getKey());
            if(c!=null){
                c.setConfigValue(entry.getValue());
                c.setConfigType(configType);
                if(this.updateSelective(c)==0){
                    return false;
                }
            }
        }
        return true;
    }
    /*全局评论状态  true为可以评论，false为不能评论*/
    public boolean getGobalCommentState() {
        String gobalCommentState = this.getConfigValue(BizConstant.CONFIG_GOBAL_COMMENT_STATE,"1");
        if ("0".equals(gobalCommentState)) {
            return false;
        }
        return true;
    }

}
